package com.webber.demo.common.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.RandomStringUtils;

/**
 * 字符串处理工具类，处理字符串空格
 *
 * @author mhl
 *
 */
public class StringUtil {

	private final static String[] agent = { "Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser" }; // 定义移动端请求的所有可能类型
	private final static String SPECIFIC_SYMBOL="[^\\w]|_"; 
	/**  
     * ASCII表中可见字符从!开始，偏移位值为33(Decimal)  
     */    
    static final char DBC_CHAR_START = 33; // 半角!    
    
    /**  
     * ASCII表中可见字符到~结束，偏移位值为126(Decimal)  
     */    
    static final char DBC_CHAR_END = 126; // 半角~    
    
    /**  
     * 全角对应于ASCII表的可见字符从！开始，偏移值为65281  
     */    
    static final char SBC_CHAR_START = 65281; // 全角！    
    
    /**  
     * 全角对应于ASCII表的可见字符到～结束，偏移值为65374  
     */    
    static final char SBC_CHAR_END = 65374; // 全角～    
    
    /**  
     * ASCII表中除空格外的可见字符与对应的全角字符的相对偏移  
     */    
    static final int CONVERT_STEP = 65248; // 全角半角转换间隔    
    
    /**  
     * 全角空格的值，它没有遵从与ASCII的相对偏移，必须单独处理  
     */    
    static final char SBC_SPACE = 12288; // 全角空格 12288    
    
    /**  
     * 半角空格的值，在ASCII中为32(Decimal)  
     */    
    static final char DBC_SPACE = ' '; // 半角空格    
    
    /**   
     * 
     * <p>Title: bj2qj</p>
     * <p>Description: 半角字符转全角字符转换   </p>
     * @param src
     * @return
     * @author JobsZhang
     * @date 2017年10月13日 下午4:27:33
     */
    private static String bj2qj(String src) {    
        if (src == null) {    
            return src;    
        }    
        StringBuilder buf = new StringBuilder(src.length());    
        char[] ca = src.toCharArray();    
        for (int i = 0; i < ca.length; i++) {    
            if (ca[i] == DBC_SPACE) { // 如果是半角空格，直接用全角空格替代    
                buf.append(SBC_SPACE);    
            } else if ((ca[i] >= DBC_CHAR_START) && (ca[i] <= DBC_CHAR_END)) { // 字符是!到~之间的可见字符    
                buf.append((char) (ca[i] + CONVERT_STEP));    
            } else { // 不对空格以及ascii表中其他可见字符之外的字符做任何处理    
                buf.append(ca[i]);    
            }    
        }    
        return buf.toString();    
    }    
    /**
     * 
     * <p>Title: qj2bj</p>
     * <p>Description: 全角转半角字符转换    
     * 只处理全角的空格，全角！到全角～之间的字符，忽略其他  </p>
     * @param src
     * @return
     * @author JobsZhang
     * @date 2017年10月13日 下午4:28:02
     */
    public static String qj2bj(String src) {    
        if (src == null) {    
            return src;    
        }    
        StringBuilder buf = new StringBuilder(src.length());    
        char[] ca = src.toCharArray();    
        for (int i = 0; i < src.length(); i++) {    
            if (ca[i] >= SBC_CHAR_START && ca[i] <= SBC_CHAR_END) { // 如果位于全角！到全角～区间内    
                buf.append((char) (ca[i] - CONVERT_STEP));    
            } else if (ca[i] == SBC_SPACE) { // 如果是全角空格    
                buf.append(DBC_SPACE);    
            } else { // 不处理全角空格，全角！到全角～区间外的字符    
                buf.append(ca[i]);    
            }    
        }    
        return buf.toString();    
    }    
    

	/**
	 * 
	 * <p>Title: cleanSpecificSymbol</p>
	 * <p>Description: 过滤特殊字符，只保留半角英文和数字</p>
	 * @param str
	 * @return
	 * @author JobsZhang
	 * @date 2017年10月13日 下午4:17:30
	 */
	public static String cleanSpecificSymbol(String str){ 
		Pattern p = Pattern.compile(SPECIFIC_SYMBOL); 
		Matcher m = p.matcher(str);
		return m.replaceAll("").trim();
	} 
	/**
	 *
	 * <p>Title: checkpasswordDWR</p>
	 * <p>Description: 判断密码强度</p>
	 * @param password
	 * @return
	 * @author JobsZhang
	 * @date 2017年9月2日 下午2:29:00
	 */
	public static boolean checkPwdStrong(String password) {
		// true 为不符合，false为符合
		int judgeCapital = checkpwd(password, ".*[A-Z]+.*");// 检查大写字母
		int judgeletter = checkpwd(password, ".*[a-z]+.*");// 检查小写字母
		int judgeNum = checkpwd(password, ".*[0-9]+.*");// 检查数字
		int judgezifu = checkpwd(password, ".*[^a-zA-Z0-9_]+.*");// 检查特殊字符
		boolean chinese = password.matches(".*[\u4e00-\u9fa5]+.*");
		int flag = 0;
		flag = judgeCapital + judgeletter + judgeNum + judgezifu;
		if (password.length() < 7 || password.length() > 20) {
			return false;
		} else {

			if (chinese) {
				return false;
			} else {
				if (flag >= 2) {
					return true;
				} else {
					return false;
				}
			}
		}

	}

	/**
	 *
	 * <p>Title: checkpwd</p>
	 * <p>Description:正则表达式匹配 </p>
	 * @param password
	 * @param rule
	 * @return
	 * @author JobsZhang
	 * @date 2017年9月2日 下午2:29:26
	 */
	private static int checkpwd(String password, String rule) {
		return password.matches(rule) ? 1 : 0;
	}


	/**
	 *
	 * <p>Title: checkuseraccount</p>
	 * <p>Description: 匹配账号</p>
	 * @param useraccount
	 * @return
	 * @author JobsZhang
	 * @date 2017年9月2日 下午2:29:50
	 */
	public  boolean checkuseraccount(String useraccount){
		char firststr = useraccount.charAt(0);
		int ask = firststr;
		boolean flag = useraccount.contains(" ");
		if(ask>=(int) 'a' && (int) 'z'>=ask && !flag){
			return true;
		}else{
			return false;
		}
	}

	/***
	 *
	 * <p>Title: checkAgentIsMobile</p>
	 * <p>Description: 判断User-Agent 是不是来自于手机</p>
	 * @param ua
	 * @return
	 * @author JobsZhang
	 * @date 2017年8月31日 下午6:07:25
	 */
	public static boolean checkAgentIsMobile(String ua) {
		boolean flag = false;
		if(ua!=null&&!"".equals(ua)) {
			if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) {
				// 排除 苹果桌面系统
				if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) {
					for (String item : agent) {
						if (ua.contains(item)) {
							flag = true;
							break;
						}
					}
				}
			}
		}
		return flag;
	}

	public static boolean containBlankStr(String... args) {
		for (String arg : args) {
			boolean isBlank = StringUtils.isBlank(arg);
			if (isBlank) {
				return true;
			}
		}
		return false;
	}

	public static boolean notContainBlankStr(String... args) {
		return !containBlankStr(args);
	}

	/**
	 * 去掉字符串中的空格
	 *
	 * @param s
	 * @return
	 */
	public static String trim(String s) {
		if (StringUtils.isBlank(s)) {
			return null;
		}
		int i = s.length();
		int j = 0;
		int k = 0;
		char[] arrayOfChar = s.toCharArray();
		while ((j < i) && (arrayOfChar[(k + j)] <= ' '))
			j++;
		while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' '))
			i--;
		return (j > 0) || (i < s.length()) ? s.substring(j, i) : s;
	}

	/**
	 * 判断字符串是不是空
     *
	 * @param str
	 * @return true是空 false不是空
	 */
	public static boolean isBlank(String str) {
		boolean result = false;
		if (StringUtils.isBlank(str)) {
			return true;
		}
		if (("".equals(trim(str))) || (trim(str).length() == 0)) {
			result = true;
		}
		return result;
	}
	/**
	 *
	 * <p>Title: notBlank</p>
	 * <p>Description: 判断不是空</p>
	 * @param str
	 * @return
	 * @author JobsZhang
	 * @date 2017年9月25日 下午5:12:17
	 */
	public static boolean notBlank(String str) {
		boolean result = false;
		if(str!=null){
			if (!StringUtils.isBlank(str.trim())) {
				return result=true;
			}
		}
		return result;
	}
	/**
     * 从路径中获取文件名，会去掉上级路径或 ../ 路径
     * @param path String
     * @return String
     */
    public static String getFileName(String path)
    {
        if(path == null || path.length() == 0)
            return path;

        path = path.replace('\0', ' ');

        int index = path.lastIndexOf("/");
        if(index != -1)
            path = path.substring(index + 1);
        index = path.lastIndexOf("\\");
        if(index != -1)
            path = path.substring(index + 1);

        return path;
    }

    /**
     * 从路径或文件名中获取后缀， 如果没有则返回 ""
     * @param path String
     * @return String
     */
    public static String getFileExt(String path)
    {
        if(path == null || path.length() == 0)
            return "";
        path = getFileName(path);
        int index = path.lastIndexOf(".");
        if(index == -1)
            return "";
        else
            return path.substring(index + 1);

    }

	/**
     * 获取路径，过滤掉 ../ 与 ./这种路径
     * 返回的是格式化过的路径，形如 /a.jsp,  /a/b.jsp 等
     * 如果传递进来的路径为null或长度为0，则直接返回
     * @param path String
     * @return String
     */
    public static String getFilePath(String path)
    {
        if(path == null || path.length() == 0)
            return path;

        path = path.replace('\0', ' ');

        String paths[] = path.split("[/\\\\]+");
        StringBuffer str = new StringBuffer();
        for(int i = 0; i < paths.length; i++)
        {
            if(paths[i].length() == 0)
                continue;
            if(paths[i].equals("."))
                continue;
            if(paths[i].equals(".."))
                continue;
            str.append("/").append(paths[i]);
        }
        if(str.length() != 0)
            return str.toString();
        else
            return "/";

    }
    /**
     *
     * <p>Title: getStr</p>
     * <p>Description: 生成指定长度的字符串</p>
     * @param length 生成字符串长度
     * @return
     * @author JobsZhang
     * @date 2017年9月25日 下午3:36:38
     */
    public static String getRandomStr(int length){
    	String chars = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+";
    	String str = "";
    	if(length>0){
    		str=RandomStringUtils.random(length, chars);
    	}
    	return str;
    }
    public static void main(String[] args) {
		System.out.println(cleanSpecificSymbol("image (70).jpg"));
		System.out.println(qj2bj("＠＃￥％ 45645dfsdf"));
	}
}

	